Move key event rewriting
authorMatthias Clasen <mclasen@redhat.com>
Wed, 15 Apr 2020 18:56:32 +0000 (14:56 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 15 Apr 2020 18:56:32 +0000 (14:56 -0400)
Stop rewriting key and focus events on the GDK side.
Instead deliver them as they are, and propagate them
from the root on the gtk side, in gtkmain.c. And
stop complaining about focus events on popups - we
can just ignore them if we have no use for them.

gdk/gdksurface.c
gtk/gtkmain.c

index f01a77978c775e8456adfa1ef099a250b5120ffd..037fca0e408fe29c1504d3c4be0c88a7713cd7bb 100644 (file)
@@ -2823,53 +2823,6 @@ check_autohide (GdkEvent *event)
   return FALSE;
 }
 
-static gboolean
-is_keyboard_event (GdkEvent *event)
-{
-  switch ((guint) gdk_event_get_event_type (event))
-    {
-    case GDK_KEY_PRESS:
-    case GDK_KEY_RELEASE:
-    case GDK_FOCUS_CHANGE:
-      return TRUE;
-    default:;
-    }
-
-  return FALSE;
-}
-
-static GdkEvent *
-rewrite_event_for_toplevel (GdkEvent *event)
-{
-  GdkSurface *surface;
-
-  surface = gdk_event_get_surface (event);
-  if (!surface->parent)
-    return gdk_event_ref (event);
-
-  while (surface->parent)
-    surface = surface->parent;
-
-  if (gdk_event_get_event_type (event) == GDK_FOCUS_CHANGE)
-    return gdk_event_focus_new (surface,
-                                gdk_event_get_device (event),
-                                gdk_event_get_source_device (event),
-                                gdk_focus_event_get_in (event));
-  else
-    {
-      return gdk_event_key_new (gdk_event_get_event_type (event),
-                                surface,
-                                gdk_event_get_device (event),
-                                gdk_event_get_source_device (event),
-                                gdk_event_get_time (event),
-                                gdk_key_event_get_keycode (event),
-                                gdk_event_get_modifier_state (event),
-                                gdk_key_event_is_modifier (event),
-                                &event->key.translated[0],
-                                &event->key.translated[1]);
-    }
-}
-
 static void
 add_event_mark (GdkEvent *event,
                 gint64    time,
@@ -2985,15 +2938,7 @@ gdk_surface_handle_event (GdkEvent *event)
     }
   else
     {
-      GdkEvent *emitted;
-
-      if (is_keyboard_event (event))
-        emitted = rewrite_event_for_toplevel (event);
-      else
-        emitted = gdk_event_ref (event);
-
-      g_signal_emit (gdk_event_get_surface (emitted), signals[EVENT], 0, emitted, &handled);
-      gdk_event_unref (emitted);
+      g_signal_emit (gdk_event_get_surface (event), signals[EVENT], 0, event, &handled);
     }
 
   if (GDK_PROFILER_IS_RUNNING)
index a34d2a8f8407392c3555329ec8b3babdeb02336b..59af57fb7d6eae0b0badee96803710cb87ab371e 100644 (file)
@@ -1226,6 +1226,30 @@ rewrite_event_for_grabs (GdkEvent *event)
     return NULL;
 }
 
+static GdkEvent *
+rewrite_event_for_toplevel (GdkEvent *event)
+{
+  GdkSurface *surface;
+
+  surface = gdk_event_get_surface (event);
+  if (!surface->parent)
+    return NULL;
+
+  while (surface->parent)
+    surface = surface->parent;
+
+  return gdk_event_key_new (gdk_event_get_event_type (event),
+                            surface,
+                            gdk_event_get_device (event),
+                            gdk_event_get_source_device (event),
+                            gdk_event_get_time (event),
+                            gdk_key_event_get_keycode (event),
+                            gdk_event_get_modifier_state (event),
+                            gdk_key_event_is_modifier (event),
+                            &event->key.translated[0],
+                            &event->key.translated[1]);
+}
+
 static gboolean
 translate_event_coordinates (GdkEvent  *event,
                              double    *x,
@@ -1430,19 +1454,6 @@ is_key_event (GdkEvent *event)
     }
 }
 
-static gboolean
-is_focus_event (GdkEvent *event)
-{
-  switch ((guint) gdk_event_get_event_type (event))
-    {
-    case GDK_FOCUS_CHANGE:
-      return TRUE;
-      break;
-    default:
-      return FALSE;
-    }
-}
-
 static inline void
 set_widget_active_state (GtkWidget       *target,
                          const gboolean   release)
@@ -1620,10 +1631,16 @@ gtk_main_do_event (GdkEvent *event)
 
   target_widget = event_widget;
 
-  /* If pointer or keyboard grabs are in effect, munge the events
+  /* We propagate key events from the root, even if they are
+   * delivered to a popup surface.
+   *
+   * If pointer or keyboard grabs are in effect, munge the events
    * so that each window group looks like a separate app.
    */
-  rewritten_event = rewrite_event_for_grabs (event);
+  if (is_key_event (event))
+    rewritten_event = rewrite_event_for_toplevel (event);
+  else
+    rewritten_event = rewrite_event_for_grabs (event);
   if (rewritten_event)
     {
       event = rewritten_event;
@@ -1643,14 +1660,6 @@ gtk_main_do_event (GdkEvent *event)
     {
       target_widget = handle_key_event (event);
     }
-  else if (is_focus_event (event))
-    {
-      if (!GTK_IS_WINDOW (target_widget))
-        {
-          g_message ("Ignoring an unexpected focus event from GDK on a non-toplevel surface.");
-          goto cleanup;
-        }
-    }
 
   if (!target_widget)
     goto cleanup;